{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "ffe4a0f6-6f41-47fe-856e-cff892d63b6e",
   "metadata": {},
   "source": [
    "# SPU Inside"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f93887c6-3641-479c-a58e-b8e2f57a9254",
   "metadata": {},
   "source": [
    "SPU is a virtual device backed by an MPC engine, which provides an *arithmetic black box* abstraction to front-end users. Just like other *black boxes*, it's not easy to understand what happened inside it.\n",
    "\n",
    "For this reason, SPU provides some features to show what happened inside it, this document demonstrates these features. \n",
    "\n",
    "## Simulation\n",
    "\n",
    "As the name suggests, *multi-party computation* is born to be distributed system with multiple participants, which makes it harder to setup, debug and inspect. So SPU provides a *simulation module* that uses threads to simulate multi-parties in a single process.  All parties acts exactly the same as in production environment, so we can use it as a playground to inspect the internals of SPU.\n",
    "\n",
    "To use the simulation module, we can simple do"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "0ad5b8d2-42b1-4a52-bce7-029ad140b092",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-10T08:43:04.072366Z",
     "start_time": "2023-07-10T08:43:03.485732Z"
    }
   },
   "outputs": [],
   "source": [
    "import spu\n",
    "import jax.numpy as jnp\n",
    "import numpy as np\n",
    "\n",
    "# import spu simulation module\n",
    "import spu.utils.simulation as pps"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a7f6c030-f1d8-4c7b-a854-05037a867c4c",
   "metadata": {},
   "source": [
    "Now we can create SPU simulator and run program on it."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "c462ad19-fa12-46b8-8461-3e8e4d736820",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-10T08:43:04.161796700Z",
     "start_time": "2023-07-10T08:43:04.098006800Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 6.  8.]\n",
      " [10. 12.]]\n"
     ]
    }
   ],
   "source": [
    "# create a simulator with ABY3 x Ring64 protocol.\n",
    "protocol = spu.ProtocolKind.ABY3\n",
    "field = spu.FieldType.FM64\n",
    "simulator = pps.Simulator.simple(3, protocol, field)\n",
    "\n",
    "# decorate a jnp function to a simulated function\n",
    "spu_add = pps.sim_jax(simulator, jnp.add)\n",
    "\n",
    "# now we can call spu_fn like normal jnp fn.\n",
    "x = np.array([[1.0, 2.0], [3.0, 4.0]])\n",
    "y = np.array([[5.0, 6.0], [7.0, 8.0]])\n",
    "\n",
    "# the function is simulated on SPU VM, which use 3 threads to simulate different parties.\n",
    "# the actual progress is exactly the same as real distributed version.\n",
    "z = spu_add(x, y)\n",
    "\n",
    "print(z)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "af286f9b-76de-40c6-a8bd-562e25056a2b",
   "metadata": {},
   "source": [
    "In the above code.\n",
    "- First, we create an SPU simulator backed by *ABY3* protocol with *FM64* field.\n",
    "- Then we decorates a jax function `jax.add` to make it a SPU simulated function.\n",
    "- Then we can use the simulated function just like normal python functions.\n",
    "\n",
    "As the result suggests, it behaves like a python function, we can also print the compiled pphlo program with"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "0e72f4d7-ce6b-4be0-952a-5abd28e94596",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-10T08:43:04.162837100Z",
     "start_time": "2023-07-10T08:43:04.143799300Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "module @xla_computation_add attributes {mhlo.cross_program_prefetches = [], mhlo.dynamic_parameter_bindings = [], mhlo.is_dynamic = false, mhlo.use_auto_spmd_partitioning = false} {\n",
      "  func.func @main(%arg0: tensor<2x2x!pphlo.sec<f32>>, %arg1: tensor<2x2x!pphlo.sec<f32>>) -> tensor<2x2x!pphlo.sec<f32>> {\n",
      "    %0 = \"pphlo.add\"(%arg0, %arg1) : (tensor<2x2x!pphlo.sec<f32>>, tensor<2x2x!pphlo.sec<f32>>) -> tensor<2x2x!pphlo.sec<f32>>\n",
      "    return %0 : tensor<2x2x!pphlo.sec<f32>>\n",
      "  }\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(spu_add.pphlo)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "758889fd-930b-4ee0-a3c3-aba55f634840",
   "metadata": {},
   "source": [
    "The above code is a pphlo dialect in [MLIR](https://mlir.llvm.org/) format, which defines a `main` function that accepts two arguments and returns the sum as result.\n",
    "\n",
    "Besides single `jax.numpy` op, we can simulate any jax function on SPU, i.e."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "e39965e9-763e-4e8c-a01c-c277ac82a2cf",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-10T08:43:04.175416Z",
     "start_time": "2023-07-10T08:43:04.161796700Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "module @xla_computation_sigmoid attributes {mhlo.cross_program_prefetches = [], mhlo.dynamic_parameter_bindings = [], mhlo.is_dynamic = false, mhlo.use_auto_spmd_partitioning = false} {\n",
      "  func.func @main(%arg0: tensor<2x2x!pphlo.sec<f32>>) -> tensor<2x2x!pphlo.sec<f32>> {\n",
      "    %0 = \"pphlo.constant\"() {value = dense<1.000000e+00> : tensor<2x2xf32>} : () -> tensor<2x2x!pphlo.pub<f32>>\n",
      "    %1 = \"pphlo.negate\"(%arg0) : (tensor<2x2x!pphlo.sec<f32>>) -> tensor<2x2x!pphlo.sec<f32>>\n",
      "    %2 = \"pphlo.exponential\"(%1) : (tensor<2x2x!pphlo.sec<f32>>) -> tensor<2x2x!pphlo.sec<f32>>\n",
      "    %3 = \"pphlo.add\"(%2, %0) : (tensor<2x2x!pphlo.sec<f32>>, tensor<2x2x!pphlo.pub<f32>>) -> tensor<2x2x!pphlo.sec<f32>>\n",
      "    %4 = \"pphlo.divide\"(%0, %3) : (tensor<2x2x!pphlo.pub<f32>>, tensor<2x2x!pphlo.sec<f32>>) -> tensor<2x2x!pphlo.sec<f32>>\n",
      "    return %4 : tensor<2x2x!pphlo.sec<f32>>\n",
      "  }\n",
      "}\n",
      "\n"
     ]
    }
   ],
   "source": [
    "def sigmoid(x):\n",
    "    return 1 / (1 + jnp.exp(-x))\n",
    "\n",
    "\n",
    "spu_sigmoid = pps.sim_jax(simulator, sigmoid)\n",
    "spu_sigmoid(x)\n",
    "\n",
    "print(spu_sigmoid.pphlo)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "beaf5df8-be1f-4aad-89c7-37ac71009985",
   "metadata": {},
   "source": [
    "The above code is `spu function` which is composed of spu builtin ops.\n",
    "\n",
    "Note: since spu use [JIT](https://en.wikipedia.org/wiki/Just-in-time_compilation) compilation, so we have to execute the function before printing the compiled bytecode."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e21cbc2d-525c-4026-8477-2455e4937d77",
   "metadata": {},
   "source": [
    "## Profling\n",
    "\n",
    "Besides simple simulation, we can profile the simulated program, although the profiling result could NOT be \n",
    "used as a reference of SPU perf, it still gives some information of what happened.\n",
    "\n",
    "To use profiling, we have enabled some feature flags."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "a073c67c-9a29-41d8-b5e9-33d286ab6021",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-10T08:43:04.243377Z",
     "start_time": "2023-07-10T08:43:04.179378200Z"
    }
   },
   "outputs": [],
   "source": [
    "config = spu.RuntimeConfig(protocol=protocol, field=field)\n",
    "config.enable_pphlo_profile = True\n",
    "simulator = pps.Simulator(3, config)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ca5d2117-b5a2-4902-a724-6e51372016c2",
   "metadata": {},
   "source": [
    "`enable_pphlo_profile` tells SPU runtime to print information about pphlo, now, let's run the function on this new runtime."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "46826fca-6ded-4405-9a3c-81d8d74b4714",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-10T08:43:04.243377Z",
     "start_time": "2023-07-10T08:43:04.224377600Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2023-07-10 08:43:04.404] [info] [api.cc:131] [Profiling] SPU execution sigmoid completed, input processing took 5.08e-07s, execution took 0.005350594s, output processing took 8.97e-07s, total time 0.005351999s.\n",
      "[2023-07-10 08:43:04.404] [info] [api.cc:163] HLO profiling: total time 0.004799822\n",
      "[2023-07-10 08:43:04.404] [info] [api.cc:166] - pphlo.add, executed 1 times, duration 1.113e-05s\n",
      "[2023-07-10 08:43:04.404] [info] [api.cc:166] - pphlo.constant, executed 1 times, duration 7.731e-06s\n",
      "[2023-07-10 08:43:04.404] [info] [api.cc:166] - pphlo.divide, executed 1 times, duration 0.003190403s\n",
      "[2023-07-10 08:43:04.404] [info] [api.cc:166] - pphlo.exponential, executed 1 times, duration 0.001568901s\n",
      "[2023-07-10 08:43:04.404] [info] [api.cc:166] - pphlo.negate, executed 1 times, duration 2.1657e-05s\n",
      "[2023-07-10 08:43:04.404] [info] [api.cc:175] Link details: total send bytes 3504, send actions 89\n"
     ]
    }
   ],
   "source": [
    "spu_sigmoid = pps.sim_jax(simulator, sigmoid)\n",
    "z = spu_sigmoid(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "15ceca0a-737f-42e8-b46c-751e788e62bd",
   "metadata": {},
   "source": [
    "The above log tells the total execution time and the detailed statistics of each builtin function.\n",
    "\n",
    "Besides the `enable_pphlo_profile` feature flag, SPU has other flags like `enable_hal_profile` to dump runtime information in different levels of instructions.\n",
    "\n",
    "## Tracing\n",
    "\n",
    "*Profiling* can only tell the statistics of SPU instructions, it's still hard to understand what happened inside it.\n",
    "*Tracing* is a feature that used to print verbose `call stack`, which helps to understand/inspect what exactly happened.\n",
    "\n",
    "To enable tracing features, just set `enable_action_trace` in the runtime config."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "918f3728-11f7-4a19-b49e-ac9e16c87955",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-10T08:43:04.243377Z",
     "start_time": "2023-07-10T08:43:04.225377200Z"
    }
   },
   "outputs": [],
   "source": [
    "config = spu.RuntimeConfig(protocol=protocol, field=field)\n",
    "config.enable_action_trace = True\n",
    "simulator = pps.Simulator(3, config)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e1767cb2-fb8c-4f89-83fe-91c332aef1cc",
   "metadata": {},
   "source": [
    "Now, let's run another function on this `tracing enabled` simulator."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "0837177f-6406-454a-ac9e-780e4d4cd8db",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-10T08:43:04.307425100Z",
     "start_time": "2023-07-10T08:43:04.225377200Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2023-07-10 08:43:04.434] [TR] [B] hlo.pphlo.multiply()\n",
      "[2023-07-10 08:43:04.434] [TR] [B]   hal.mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.434] [TR] [B]     hal.f_mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.434] [TR] [B]       hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.434] [TR] [B]         hal._mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.434] [TR] [B]           mpc.mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.434] [TR] [B]             mpc.mul_aa(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.434] [TR] [E]             mpc.mul_aa(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.434] [TR] [E]           mpc.mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.434] [TR] [E]         hal._mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.434] [TR] [E]       hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.434] [TR] [B]       hal._trunc(Value<2x2xS*,s=2,1>, 0)\n",
      "[2023-07-10 08:43:04.434] [TR] [B]         hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.434] [TR] [B]           mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.434] [TR] [B]             mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.434] [TR] [E]             mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.434] [TR] [E]           mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.434] [TR] [E]         hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.434] [TR] [E]       hal._trunc(Value<2x2xS*,s=2,1>, 0)\n",
      "[2023-07-10 08:43:04.434] [TR] [E]     hal.f_mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.434] [TR] [E]   hal.mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.434] [TR] [E] hlo.pphlo.multiply()\n"
     ]
    }
   ],
   "source": [
    "spu_mul = pps.sim_jax(simulator, jnp.multiply)\n",
    "z = spu_mul(x, y)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "b39bc0e3-ba47-4cad-8e49-ad397f289f26",
   "metadata": {},
   "source": [
    "At the first glance, the trace log is a bit of frustrating, so it worth a little while to explain it.\n",
    "\n",
    "At the very begining, is the entry point of `multiply` function.\n",
    "\n",
    "Each line follows the format as below:\n",
    "```\n",
    "[timestamp] [TR] [B/E] module.op(value_type...)\n",
    "```\n",
    "\n",
    "For example, the second line `[timestamp] [TR] [B]   hal.mul(Value<2x2xSFXP,s=2,1>, Value<2x2xSFXP,s=2,1>)` means:\n",
    "- this is a tracing log indicated by `[TR]`\n",
    "- the function begins/ends `[B/E]`\n",
    "- the module is `hal`\n",
    "- the operator is `mul`\n",
    "- the two args are both `Value<2x2xSFXP,s=2,1>`\n",
    "\n",
    "Note, `hlo` is short for `High Level Operations`, `hal` is short for `Hardware Abstraction Layer`, `mpc` is short for `Multi-Party Computation`.\n",
    "\n",
    "The `Value<2x2xSFXP,s=2,1>` means it's a **S**ecret **F**i**X**ed **P**ointed tensor with shape(**2x2**) and strides(**2,1**). \n",
    "\n",
    "1. the runtime dispatches the function according parameters datatype (in this case *fxp*), then calls the corresponding fixed point handle function `hal.f_mul`, the prefix `f_` means its for fixed point.\n",
    "2. the runtime dispatches `hal.f_mul` to the untyped version `hal._mul` which operates on `rings`.\n",
    "3. the runtime dispatches `hal._mul` according to the *visibility* type, since both parameters are **secret**, so `hal._mul_ss` is called, the postfix `_ss` indicates that it operates on two secrets.\n",
    "\n",
    "Then the function `hal._mul_ss` is dispatched to the MPC layer, the signature becomes more complicated.\n",
    "```\n",
    "mpc.mul_ss(ArrayRef<4xaby3.AShr<FM64>>,ArrayRef<4xaby3.AShr<FM64>>)\n",
    "```\n",
    "The signature of this operation is the same as above, `mpc.mul_ss` indicates the module is `mpc` and the operation is `mul_ss`.\n",
    "\n",
    "The type `ArrayRef<4xaby3.AShr<FM64>>` has two notable differences:\n",
    "1. unlike hal ops, mpc ops operates on 1D-array instead of tensor, which makes it a more standard SIMD instruction.\n",
    "2. the type `aby3.AShr<FM64>` is protocol-dependent, in this case, it's an *ABY3* arithmetic share in FM64.\n",
    "\n",
    "Finally, it's dispatched to `mpc.mul_aa`, the postfix `_aa` indicates both parameters are arithmetic shares, then the ABY3 share addition protocol is performed.\n",
    "\n",
    "But `f_mul` could not be done with ring multiplication only, we have to `truncate` the result to make the fixed point legal, in the following lines, `hal._trunc` is called and finally dispatched to `mpc.trunc_a` protocol."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3f80f56e-1e1d-49fc-866d-e91faed5b10e",
   "metadata": {},
   "source": [
    "The above example is pretty straight forward, now let's make it harder.\n",
    "\n",
    "Fixed point reciprocal is done with [Goldschmidt](https://en.wikipedia.org/wiki/Division_algorithm#Goldschmidt_division) approximation algorithm, the algorithm itself is not that simple, and when it's executed on MPC, things become more complicated.\n",
    "\n",
    "It takes a lot of effort to understand how it works, let's directly see the tracing result."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "2bddac60-6e07-459b-8d26-6d77efdfb3d5",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-10T08:43:04.323374900Z",
     "start_time": "2023-07-10T08:43:04.265377300Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2023-07-10 08:43:04.454] [TR] [B] hlo.pphlo.constant()\n",
      "[2023-07-10 08:43:04.454] [TR] [B]   hal.constant(PtBufferView<0x7fd59c0123f8,xPT_F32,>, F32, {})\n",
      "[2023-07-10 08:43:04.454] [TR] [B]     hal.make_pub2k(PtBufferView<0x7fd59c0123f8,xPT_F32,>)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]     hal.make_pub2k(PtBufferView<0x7fd59c0123f8,xPT_F32,>)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]   hal.constant(PtBufferView<0x7fd59c0123f8,xPT_F32,>, F32, {})\n",
      "[2023-07-10 08:43:04.454] [TR] [B]   hal.broadcast_to(Value<xPF32,s=>, {2,2})\n",
      "[2023-07-10 08:43:04.454] [TR] [E]   hal.broadcast_to(Value<xPF32,s=>, {2,2})\n",
      "[2023-07-10 08:43:04.454] [TR] [E] hlo.pphlo.constant()\n",
      "[2023-07-10 08:43:04.454] [TR] [B] hlo.pphlo.divide()\n",
      "[2023-07-10 08:43:04.454] [TR] [B]   hal.div(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]     hal.dtype_cast(Value<2x2xPF32,s=0,0>, F32)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]     hal.dtype_cast(Value<2x2xPF32,s=0,0>, F32)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]     hal.dtype_cast(Value<2x2xSF32,s=2,1>, F32)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]     hal.dtype_cast(Value<2x2xSF32,s=2,1>, F32)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]     hal.f_div(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]       hal.div_goldschmidt(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]         hal._msb(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]           hal._msb_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]             mpc.msb_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]               mpc.msb_a2b(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.and_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.and_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.rshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.rshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.rshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.rshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.rshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.rshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.454] [TR] [B]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.454] [TR] [E]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.rshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.rshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.rshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.rshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.rshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.rshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.rshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.rshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.rshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.rshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.rshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.rshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.rshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.rshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.rshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.rshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.bitdeintl_b(Value<4xS*,s=1>, 0)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.rshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.rshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.and_bp(Value<4xS*,s=1>, Value<4xP*,s=0>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [E]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.455] [TR] [B]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                 mpc.rshift_b(Value<4xS*,s=1>, 63)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                 mpc.rshift_b(Value<4xS*,s=1>, 63)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                 mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]               mpc.msb_a2b(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]             mpc.msb_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]           hal._msb_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]         hal._msb(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]         hal._make_p(0)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]           mpc.make_p(0, {2,2})\n",
      "[2023-07-10 08:43:04.456] [TR] [E]           mpc.make_p(0, {2,2})\n",
      "[2023-07-10 08:43:04.456] [TR] [E]         hal._make_p(0)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]         hal._add(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]           hal._add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]             mpc.add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]               mpc.b2a(Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]               mpc.b2a(Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]               mpc.add_ap(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]               mpc.add_ap(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]             mpc.add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]           hal._add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]         hal._add(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]         hal._negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]           hal._make_p(1)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]             mpc.make_p(1, {2,2})\n",
      "[2023-07-10 08:43:04.456] [TR] [E]             mpc.make_p(1, {2,2})\n",
      "[2023-07-10 08:43:04.456] [TR] [E]           hal._make_p(1)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]           hal._not(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]             hal._not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]               mpc.not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                 mpc.not_a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                 mpc.not_a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]               mpc.not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]             hal._not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]           hal._not(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]           hal._add(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]             hal._add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]               mpc.add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                 mpc.add_ap(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                 mpc.add_ap(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]               mpc.add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]             hal._add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]           hal._add(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]         hal._negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]         hal._mux(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]           hal._sub(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]             hal._negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]               hal._make_p(1)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                 mpc.make_p(1, {2,2})\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                 mpc.make_p(1, {2,2})\n",
      "[2023-07-10 08:43:04.456] [TR] [E]               hal._make_p(1)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]               hal._not(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                 hal._not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                   mpc.not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                     mpc.not_a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                     mpc.not_a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                   mpc.not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                 hal._not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]               hal._not(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]               hal._add(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                 hal._add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                   mpc.add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                     mpc.add_ap(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                     mpc.add_ap(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                   mpc.add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                 hal._add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]               hal._add(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]             hal._negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]             hal._add(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]               hal._add_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                 mpc.add_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                   mpc.add_aa(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                   mpc.add_aa(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                 mpc.add_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]               hal._add_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]             hal._add(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]           hal._sub(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]           hal._mul(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]             hal._mul_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]               mpc.mul_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                 mpc.mul_aa(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                 mpc.mul_aa(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]               mpc.mul_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]             hal._mul_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]           hal._mul(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]           hal._add(Value<2x2xSF32,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]             hal._add_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]               mpc.add_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                 mpc.add_aa(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]                 mpc.add_aa(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]               mpc.add_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]             hal._add_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]           hal._add(Value<2x2xSF32,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [E]         hal._mux(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]         hal._prefix_or(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]           hal._make_p(0)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]             mpc.make_p(0, {2,2})\n",
      "[2023-07-10 08:43:04.456] [TR] [E]             mpc.make_p(0, {2,2})\n",
      "[2023-07-10 08:43:04.456] [TR] [E]           hal._make_p(0)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]           hal._xor(Value<2x2xSF32,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]             hal._xor_sp(Value<2x2xSF32,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]               mpc.xor_sp(Value<2x2xSF32,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                 mpc.a2b(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                   mpc.add_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.456] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.and_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.and_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                   mpc.add_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                 mpc.a2b(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                 mpc.xor_bp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                 mpc.xor_bp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]               mpc.xor_sp(Value<2x2xSF32,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]             hal._xor_sp(Value<2x2xSF32,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]           hal._xor(Value<2x2xSF32,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]           hal._rshift(Value<2x2xSF32,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]             hal._rshift_s(Value<2x2xSF32,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]               mpc.rshift_s(Value<2x2xSF32,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                 mpc.rshift_b(Value<2x2xSF32,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                 mpc.rshift_b(Value<2x2xSF32,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]               mpc.rshift_s(Value<2x2xSF32,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]             hal._rshift_s(Value<2x2xSF32,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]           hal._rshift(Value<2x2xSF32,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]           hal._and(Value<2x2xSF32,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]             hal._and_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]               mpc.and_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                 mpc.and_bb(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                 mpc.and_bb(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]               mpc.and_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]             hal._and_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]           hal._and(Value<2x2xSF32,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [B]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.457] [TR] [E]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]           hal._xor(Value<2x2xSF32,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]           hal._xor(Value<2x2xSF32,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]           hal._rshift(Value<2x2xS*,s=2,1>, 2)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]             hal._rshift_s(Value<2x2xS*,s=2,1>, 2)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]               mpc.rshift_s(Value<2x2xS*,s=2,1>, 2)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]                 mpc.rshift_b(Value<2x2xS*,s=2,1>, 2)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]                 mpc.rshift_b(Value<2x2xS*,s=2,1>, 2)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]               mpc.rshift_s(Value<2x2xS*,s=2,1>, 2)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]             hal._rshift_s(Value<2x2xS*,s=2,1>, 2)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]           hal._rshift(Value<2x2xS*,s=2,1>, 2)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]           hal._and(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]             hal._and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]               mpc.and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]                 mpc.and_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]                 mpc.and_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]               mpc.and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]             hal._and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]           hal._and(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]           hal._rshift(Value<2x2xS*,s=2,1>, 4)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]             hal._rshift_s(Value<2x2xS*,s=2,1>, 4)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]               mpc.rshift_s(Value<2x2xS*,s=2,1>, 4)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]                 mpc.rshift_b(Value<2x2xS*,s=2,1>, 4)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]                 mpc.rshift_b(Value<2x2xS*,s=2,1>, 4)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]               mpc.rshift_s(Value<2x2xS*,s=2,1>, 4)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]             hal._rshift_s(Value<2x2xS*,s=2,1>, 4)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]           hal._rshift(Value<2x2xS*,s=2,1>, 4)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]           hal._and(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]             hal._and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]               mpc.and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]                 mpc.and_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]                 mpc.and_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]               mpc.and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]             hal._and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]           hal._and(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]           hal._rshift(Value<2x2xS*,s=2,1>, 8)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]             hal._rshift_s(Value<2x2xS*,s=2,1>, 8)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]               mpc.rshift_s(Value<2x2xS*,s=2,1>, 8)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]                 mpc.rshift_b(Value<2x2xS*,s=2,1>, 8)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]                 mpc.rshift_b(Value<2x2xS*,s=2,1>, 8)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]               mpc.rshift_s(Value<2x2xS*,s=2,1>, 8)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]             hal._rshift_s(Value<2x2xS*,s=2,1>, 8)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]           hal._rshift(Value<2x2xS*,s=2,1>, 8)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]           hal._and(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]             hal._and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]               mpc.and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]                 mpc.and_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]                 mpc.and_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]               mpc.and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]             hal._and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]           hal._and(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]           hal._rshift(Value<2x2xS*,s=2,1>, 16)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]             hal._rshift_s(Value<2x2xS*,s=2,1>, 16)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]               mpc.rshift_s(Value<2x2xS*,s=2,1>, 16)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]                 mpc.rshift_b(Value<2x2xS*,s=2,1>, 16)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]                 mpc.rshift_b(Value<2x2xS*,s=2,1>, 16)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]               mpc.rshift_s(Value<2x2xS*,s=2,1>, 16)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]             hal._rshift_s(Value<2x2xS*,s=2,1>, 16)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]           hal._rshift(Value<2x2xS*,s=2,1>, 16)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]           hal._and(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]             hal._and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]               mpc.and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [B]                 mpc.and_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]                 mpc.and_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]               mpc.and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]             hal._and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.458] [TR] [E]           hal._and(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]           hal._rshift(Value<2x2xS*,s=2,1>, 32)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]             hal._rshift_s(Value<2x2xS*,s=2,1>, 32)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]               mpc.rshift_s(Value<2x2xS*,s=2,1>, 32)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                 mpc.rshift_b(Value<2x2xS*,s=2,1>, 32)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                 mpc.rshift_b(Value<2x2xS*,s=2,1>, 32)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]               mpc.rshift_s(Value<2x2xS*,s=2,1>, 32)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]             hal._rshift_s(Value<2x2xS*,s=2,1>, 32)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]           hal._rshift(Value<2x2xS*,s=2,1>, 32)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]           hal._and(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]             hal._and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]               mpc.and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                 mpc.and_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                 mpc.and_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]               mpc.and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]             hal._and_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]           hal._and(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                 mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]               mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]             hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]           hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]         hal._prefix_or(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]         hal._rshift(Value<2x2xS*,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]           hal._rshift_s(Value<2x2xS*,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]             mpc.rshift_s(Value<2x2xS*,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]               mpc.rshift_b(Value<2x2xS*,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]               mpc.rshift_b(Value<2x2xS*,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]             mpc.rshift_s(Value<2x2xS*,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]           hal._rshift_s(Value<2x2xS*,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]         hal._rshift(Value<2x2xS*,s=2,1>, 1)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]         hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]           hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]             mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]               mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]               mpc.xor_bb(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]             mpc.xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]           hal._xor_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]         hal._xor(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]         hal._bitrev(Value<2x2xS*,s=2,1>, 0, 36)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]           hal._bitrev_s(Value<2x2xS*,s=2,1>, 0, 36)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]             mpc.bitrev_s(Value<2x2xS*,s=2,1>, 0, 36)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]               mpc.bitrev_b(Value<2x2xS*,s=2,1>, 0, 36)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]               mpc.bitrev_b(Value<2x2xS*,s=2,1>, 0, 36)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]             mpc.bitrev_s(Value<2x2xS*,s=2,1>, 0, 36)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]           hal._bitrev_s(Value<2x2xS*,s=2,1>, 0, 36)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]         hal._bitrev(Value<2x2xS*,s=2,1>, 0, 36)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]         hal.f_mul_with_sign(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]           hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]             hal._mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]               mpc.mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                 mpc.b2a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                   mpc.add_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                     mpc.and_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                     mpc.and_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.459] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.459] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                   mpc.add_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                 mpc.b2a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                 mpc.mul_aa(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                 mpc.mul_aa(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]               mpc.mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]             hal._mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]           hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]           hal._trunc_with_sign(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]             hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]               mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                 mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                 mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]               mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]             hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]           hal._trunc_with_sign(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]         hal.f_mul_with_sign(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]         hal._make_p(2)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]           mpc.make_p(2, {2,2})\n",
      "[2023-07-10 08:43:04.460] [TR] [E]           mpc.make_p(2, {2,2})\n",
      "[2023-07-10 08:43:04.460] [TR] [E]         hal._make_p(2)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]         hal.constant(PtBufferView<0x7fd5d1ff8250,xPT_F32,>, F32, {2,2})\n",
      "[2023-07-10 08:43:04.460] [TR] [B]           hal.make_pub2k(PtBufferView<0x7fd5d1ff8250,xPT_F32,>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]           hal.make_pub2k(PtBufferView<0x7fd5d1ff8250,xPT_F32,>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]         hal.constant(PtBufferView<0x7fd5d1ff8250,xPT_F32,>, F32, {2,2})\n",
      "[2023-07-10 08:43:04.460] [TR] [B]         hal._mul(Value<2x2xP*,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]           hal._mul_sp(Value<2x2xSF32,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]             mpc.mul_sp(Value<2x2xSF32,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]               mpc.mul_ap(Value<2x2xSF32,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]               mpc.mul_ap(Value<2x2xSF32,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]             mpc.mul_sp(Value<2x2xSF32,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]           hal._mul_sp(Value<2x2xSF32,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]         hal._mul(Value<2x2xP*,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]         hal.f_sub(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]           hal.f_negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]             hal._negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]               hal._make_p(1)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                 mpc.make_p(1, {2,2})\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                 mpc.make_p(1, {2,2})\n",
      "[2023-07-10 08:43:04.460] [TR] [E]               hal._make_p(1)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]               hal._not(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                 hal._not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                   mpc.not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.not_a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.not_a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                   mpc.not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                 hal._not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]               hal._not(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]               hal._add(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                 hal._add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                   mpc.add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]                     mpc.add_ap(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                     mpc.add_ap(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                   mpc.add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]                 hal._add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]               hal._add(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]             hal._negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [E]           hal.f_negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]           hal.f_add(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]             hal._add(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.460] [TR] [B]               hal._add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                 mpc.add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                   mpc.add_ap(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                   mpc.add_ap(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                 mpc.add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]               hal._add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]             hal._add(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]           hal.f_add(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]         hal.f_sub(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]         hal.constant(PtBufferView<0x7fd5d1ff8250,xPT_F32,>, F32, {2,2})\n",
      "[2023-07-10 08:43:04.461] [TR] [B]           hal.make_pub2k(PtBufferView<0x7fd5d1ff8250,xPT_F32,>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]           hal.make_pub2k(PtBufferView<0x7fd5d1ff8250,xPT_F32,>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]         hal.constant(PtBufferView<0x7fd5d1ff8250,xPT_F32,>, F32, {2,2})\n",
      "[2023-07-10 08:43:04.461] [TR] [B]         hal.f_mul_with_sign(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]           hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]             hal._mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]               mpc.mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                 mpc.mul_aa(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                 mpc.mul_aa(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]               mpc.mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]             hal._mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]           hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]           hal._trunc_with_sign(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]             hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]               mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                 mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                 mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]               mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]             hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]           hal._trunc_with_sign(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]         hal.f_mul_with_sign(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]         hal.f_sub(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]           hal.f_negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]             hal._negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]               hal._make_p(1)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                 mpc.make_p(1, {2,2})\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                 mpc.make_p(1, {2,2})\n",
      "[2023-07-10 08:43:04.461] [TR] [E]               hal._make_p(1)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]               hal._not(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                 hal._not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                   mpc.not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                     mpc.not_a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                     mpc.not_a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                   mpc.not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                 hal._not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]               hal._not(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]               hal._add(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                 hal._add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                   mpc.add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                     mpc.add_ap(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                     mpc.add_ap(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                   mpc.add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                 hal._add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]               hal._add(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]             hal._negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]           hal.f_negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]           hal.f_add(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]             hal._add(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]               hal._add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                 mpc.add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                   mpc.add_ap(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                   mpc.add_ap(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                 mpc.add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]               hal._add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]             hal._add(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]           hal.f_add(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]         hal.f_sub(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]         hal.f_add(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]           hal._add(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]             hal._add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]               mpc.add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                 mpc.add_ap(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                 mpc.add_ap(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]               mpc.add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]             hal._add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]           hal._add(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]         hal.f_add(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]         hal.f_mul_with_sign(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]           hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]             hal._mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]               mpc.mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                 mpc.mul_aa(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                 mpc.mul_aa(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]               mpc.mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]             hal._mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]           hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]           hal._trunc_with_sign(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]             hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]               mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                 mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                 mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]               mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]             hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]           hal._trunc_with_sign(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]         hal.f_mul_with_sign(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]         hal.f_square(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]           hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]             hal._mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]               mpc.mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                 mpc.mul_aa(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                 mpc.mul_aa(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]               mpc.mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]             hal._mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]           hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]           hal._trunc_with_sign(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]             hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]               mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [B]                 mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]                 mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]               mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]             hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]           hal._trunc_with_sign(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.461] [TR] [E]         hal.f_square(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]         hal.f_add(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]           hal._add(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]             hal._add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]               mpc.add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                 mpc.add_ap(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                 mpc.add_ap(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]               mpc.add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]             hal._add_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]           hal._add(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]         hal.f_add(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]         hal.f_mul_with_sign(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]           hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]             hal._mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]               mpc.mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                 mpc.mul_aa(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                 mpc.mul_aa(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]               mpc.mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]             hal._mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]           hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]           hal._trunc_with_sign(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]             hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]               mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                 mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                 mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]               mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]             hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]           hal._trunc_with_sign(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]         hal.f_mul_with_sign(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]         hal.f_mul(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]           hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]             hal._mul_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]               mpc.mul_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                 mpc.mul_ap(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                 mpc.mul_ap(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]               mpc.mul_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]             hal._mul_sp(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]           hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]           hal._trunc(Value<2x2xS*,s=2,1>, 0)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]             hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]               mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                 mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                 mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]               mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]             hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]           hal._trunc(Value<2x2xS*,s=2,1>, 0)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]         hal.f_mul(Value<2x2xSF32,s=2,1>, Value<2x2xPF32,s=0,0>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]         hal.f_mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]           hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]             hal._mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]               mpc.mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                 mpc.b2a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                   mpc.add_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.and_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.and_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 2)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 4)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 8)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 16)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 32)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.and_bb(Value<8xS*,s=1>, Value<8xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.lshift_b(Value<4xS*,s=1>, 1)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [B]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.462] [TR] [E]                     mpc.xor_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                   mpc.add_bb(Value<4xS*,s=1>, Value<4xS*,s=1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                 mpc.b2a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]                 mpc.mul_aa(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                 mpc.mul_aa(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]               mpc.mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]             hal._mul_ss(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]           hal._mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]           hal._trunc(Value<2x2xS*,s=2,1>, 0)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]             hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]               mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]                 mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                 mpc.trunc_a(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]               mpc.trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]             hal._trunc_s(Value<2x2xS*,s=2,1>, 18)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]           hal._trunc(Value<2x2xS*,s=2,1>, 0)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]         hal.f_mul(Value<2x2xSF32,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]         hal._negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]           hal._make_p(1)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]             mpc.make_p(1, {2,2})\n",
      "[2023-07-10 08:43:04.463] [TR] [E]             mpc.make_p(1, {2,2})\n",
      "[2023-07-10 08:43:04.463] [TR] [E]           hal._make_p(1)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]           hal._not(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]             hal._not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]               mpc.not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]                 mpc.not_a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                 mpc.not_a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]               mpc.not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]             hal._not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]           hal._not(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]           hal._add(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]             hal._add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]               mpc.add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]                 mpc.add_ap(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                 mpc.add_ap(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]               mpc.add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]             hal._add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]           hal._add(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]         hal._negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]         hal._mux(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]           hal._sub(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]             hal._negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]               hal._make_p(1)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]                 mpc.make_p(1, {2,2})\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                 mpc.make_p(1, {2,2})\n",
      "[2023-07-10 08:43:04.463] [TR] [E]               hal._make_p(1)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]               hal._not(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]                 hal._not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]                   mpc.not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]                     mpc.not_a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                     mpc.not_a(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                   mpc.not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                 hal._not_s(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]               hal._not(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]               hal._add(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]                 hal._add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]                   mpc.add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]                     mpc.add_ap(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                     mpc.add_ap(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                   mpc.add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                 hal._add_sp(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]               hal._add(Value<2x2xS*,s=2,1>, Value<2x2xP*,s=0,0>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]             hal._negate(Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]             hal._add(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]               hal._add_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]                 mpc.add_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]                   mpc.add_aa(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                   mpc.add_aa(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                 mpc.add_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]               hal._add_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]             hal._add(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]           hal._sub(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]           hal._mul(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]             hal._mul_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]               mpc.mul_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]                 mpc.mul_aa(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                 mpc.mul_aa(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]               mpc.mul_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]             hal._mul_ss(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]           hal._mul(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]           hal._add(Value<2x2xSF32,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]             hal._add_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]               mpc.add_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [B]                 mpc.add_aa(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]                 mpc.add_aa(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]               mpc.add_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]             hal._add_ss(Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]           hal._add(Value<2x2xSF32,s=2,1>, Value<2x2xS*,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]         hal._mux(Value<2x2xS*,s=2,1>, Value<2x2xS*,s=2,1>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]       hal.div_goldschmidt(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]     hal.f_div(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E]   hal.div(Value<2x2xPF32,s=0,0>, Value<2x2xSF32,s=2,1>)\n",
      "[2023-07-10 08:43:04.463] [TR] [E] hlo.pphlo.divide()\n"
     ]
    }
   ],
   "source": [
    "spu_reciprocal = pps.sim_jax(simulator, jnp.reciprocal)\n",
    "z = spu_reciprocal(x)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "id": "9a3fdc33-ad15-4165-a86d-1dda143465c0",
   "metadata": {},
   "source": [
    "Surprise, it's really a lot of ops!\n",
    "\n",
    "Yes, that's why MPC is still relatively slow and why SPU wants to optimize it :P\n",
    "\n",
    "The `reciprocal` is still a relative simple operator, you can try more complicated op like `convolution`."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d28fb8c7-5ca5-44e7-a795-1edd042a6f1e",
   "metadata": {},
   "source": [
    "## Misc\n",
    "\n",
    "Simulation could be used to inspect other parts of SPU, i.e. the *fixed point arithmetic* accuracy.\n",
    "\n",
    "As the above example indicates, non-linear functions like `reciprocal` and `exp` are approximated with some numeric methods, so the result is not as accurate as floating point arithmetic.\n",
    "\n",
    "For example."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "132ec47e",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-10T08:43:06.470145200Z",
     "start_time": "2023-07-10T08:43:04.314378400Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Requirement already satisfied: matplotlib in /opt/anaconda3/envs/limingbo_sf/lib/python3.8/site-packages (3.7.1)\r\n",
      "Requirement already satisfied: contourpy>=1.0.1 in /opt/anaconda3/envs/limingbo_sf/lib/python3.8/site-packages (from matplotlib) (1.0.5)\r\n",
      "Requirement already satisfied: cycler>=0.10 in /opt/anaconda3/envs/limingbo_sf/lib/python3.8/site-packages (from matplotlib) (0.11.0)\r\n",
      "Requirement already satisfied: fonttools>=4.22.0 in /opt/anaconda3/envs/limingbo_sf/lib/python3.8/site-packages (from matplotlib) (4.25.0)\r\n",
      "Requirement already satisfied: kiwisolver>=1.0.1 in /opt/anaconda3/envs/limingbo_sf/lib/python3.8/site-packages (from matplotlib) (1.4.4)\r\n",
      "Requirement already satisfied: numpy>=1.20 in /opt/anaconda3/envs/limingbo_sf/lib/python3.8/site-packages (from matplotlib) (1.23.5)\r\n",
      "Requirement already satisfied: packaging>=20.0 in /opt/anaconda3/envs/limingbo_sf/lib/python3.8/site-packages (from matplotlib) (23.0)\r\n",
      "Requirement already satisfied: pillow>=6.2.0 in /opt/anaconda3/envs/limingbo_sf/lib/python3.8/site-packages (from matplotlib) (10.0.0)\r\n",
      "Requirement already satisfied: pyparsing>=2.3.1 in /opt/anaconda3/envs/limingbo_sf/lib/python3.8/site-packages (from matplotlib) (3.0.9)\r\n",
      "Requirement already satisfied: python-dateutil>=2.7 in /opt/anaconda3/envs/limingbo_sf/lib/python3.8/site-packages (from matplotlib) (2.8.2)\r\n",
      "Requirement already satisfied: importlib-resources>=3.2.0 in /opt/anaconda3/envs/limingbo_sf/lib/python3.8/site-packages (from matplotlib) (5.2.0)\r\n",
      "Requirement already satisfied: zipp>=3.1.0 in /opt/anaconda3/envs/limingbo_sf/lib/python3.8/site-packages (from importlib-resources>=3.2.0->matplotlib) (3.11.0)\r\n",
      "Requirement already satisfied: six>=1.5 in /opt/anaconda3/envs/limingbo_sf/lib/python3.8/site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\r\n",
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "%pip install matplotlib"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "9d4b6845-f129-490a-8be5-3e86ec5430a6",
   "metadata": {
    "ExecuteTime": {
     "end_time": "2023-07-10T08:43:07.419039Z",
     "start_time": "2023-07-10T08:43:06.477463300Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 640x480 with 1 Axes>",
      "image/png": "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Oa+//jqdO3fm+PHjfPTRR5w8edK5zezZs5k0aRJFRUUsXbqUyZMn07p1a26//XYTKxcREa9QWQ4n9kF4NIRcYloZCjde4vTp03z66adkZGQwfPhwABISErj66qtdtgsPDycmJgaAp59+mn/84x+sXLlS4UZERBrv1EGYNwiCwiH1iGllKNxchGEYlJRXmvLaIYH+dR6JFBYWRlhYGCtXrmTw4MFYrdY67RccHKwh3CIi0jSKjtvvw6NNLUPh5iJKyiu58g//NuW1v5k9ilZBdfuKAgICWLp0KZMmTWLBggX069eP4cOH84tf/ILevXtX2b6iooJly5axc+dO7r///qYuXUREfFFhjv0+zNxwow7FXmT8+PEcO3aMVatWMWrUKDIyMujXrx9Lly51bvPYY48RFhZGSEgIU6ZM4ZFHHuHXv/61eUWLiIj3cJy5MTnc6MzNRYQE+vPN7FGmvXZ9BQcHc8MNN3DDDTfwhz/8gfvuu4+ZM2cyceJEAB555BEmTpxIq1atiI2NdWn2ioiIID8/v8oxHZOIRkZGNuh9iIiIj3A2S8WYWoapZ27mz59P7969iYiIICIigqSkJD744IMat8/IyHAOZT7/9u233zZbjRaLhVZBAabcmuLKv1deeSXFxcXOx+3ateOyyy4jLi6uyvG7devGkSNHyMnJcVmfmZmJn58fl112WaPrERERL1boOHMTZWoZpp656dChA88++6zzj+brr7/OLbfcwvbt2+nRo0eN++3Zs4eIiAjn4/bt2zd7re7uxIkT/PznP+dXv/oVvXv3Jjw8nG3btvHcc89xyy231OkYycnJdO/enV/84hc888wzxMXFsWPHDqZPn87kyZMJDw9v5nchIiIercjR58bcMzemhpuxY8e6PH7mmWeYP38+W7ZsqTXcREVF0bp162auzrOEhYUxaNAgXnzxRfbt20d5eTnx8fFMmjSJ1NTUOh0jICCAtWvXkpqayp133klubi4JCQncd999PProo838DkRExOMV5drvNVrKrrKykvfee4/i4mKSkpJq3bZv376cPXuWK6+8kieeeIJrr722xm1LS0spLS11Pi4oKGiymt2J1WolLS2NtLS0Grc5ePDgRY8TExPD4sWLm7AyERHxGYXucebG9NFSO3fuJCwsDKvVyuTJk1mxYgVXXnlltdvGxsaycOFC0tPTWb58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"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "simulator = pps.Simulator.simple(3, protocol, spu.FieldType.FM128)\n",
    "spu_exp = pps.sim_jax(simulator, jnp.exp)\n",
    "\n",
    "x = np.arange(0.0, 23.0)\n",
    "spu_y = spu_exp(x)\n",
    "jax_y = jnp.exp(x)\n",
    "plt.title(\"Matplotlib demo\")\n",
    "plt.plot(x, spu_y, label=\"SPU\")\n",
    "plt.plot(x, jax_y, label=\"JAX\")\n",
    "plt.xlabel(\"x\")\n",
    "plt.ylabel(\"y\")\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dff64df6-0586-414e-96ea-1e35cdec0e29",
   "metadata": {},
   "source": [
    "As we can see, the SPU version of `exp` (blue line) diverges with the standard version when input is larger. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8c0e7ae9-72c3-43af-adb4-b273b16883ec",
   "metadata": {},
   "source": [
    "Finally, SPU, as a secure computation, behaves very differently from CPU, both in accuracy and cost model, when you are not sure about how it works, simulate on it! "
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.16"
  },
  "vscode": {
   "interpreter": {
    "hash": "830c23f57e6253683b92f2449db82410e6451d1b59048f91eefc53b20217e543"
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
